import time
from datetime import datetime, timedelta
from typing import Optional


class Timer:
    """高精度定时器类，用于时间测量和超时控制"""

    def __init__(self, time_limit_s: float):
        """
        初始化定时器
        :param time_limit_s: 时间限制（秒）
        """
        self._start = datetime.now()  # 起始时间点
        self.ms_time_limit = int(time_limit_s * 1000)  # 毫秒时间限制

    def start(self) -> None:
        """重置计时器，从当前时间重新开始计时"""
        self._start = datetime.now()

    def click_ms(self) -> int:
        """
        获取已流逝的毫秒数
        :return: 已流逝毫秒数
        """
        curr_time = datetime.now()
        delta = curr_time - self._start
        return int(delta.total_seconds() * 1000)

    def click_s(self) -> int:
        """
        获取已流逝的秒数
        :return: 已流逝秒数
        """
        return int(self.click_ms() / 1000)

    def get_remaining_time(self) -> float:
        """
        获取剩余时间（秒）
        :return: 剩余时间，若已超时则返回0
        """
        elapsed_ms = self.click_ms()
        remaining_ms = max(0, self.ms_time_limit - elapsed_ms)
        return remaining_ms / 1000.0

    def is_stop(self) -> bool:
        """
        判断是否超时
        :return: 若已超时返回True，否则返回False
        """
        return self.click_ms() >= self.ms_time_limit

    def get_time_limit(self) -> int:
        """
        获取时间限制（毫秒）
        :return: 时间限制（毫秒）
        """
        return self.ms_time_limit
